home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / magic / i / mtcomman.i < prev    next >
Encoding:
Modula Implementation  |  1997-10-26  |  7.6 KB  |  247 lines

  1. (*----------------------------------------------------------------------*
  2.  *                                                                      *
  3.  *  MAGICTOOLS   Modula's  All purpose  GEM  Interface  Cadre  Toolbox  *
  4.  *               ÿ         ÿ            ÿ    ÿ          ÿ               *
  5.  *----------------------------------------------------------------------*
  6.  * Version 3.30  02.02.1992     (C)90/91/92 by Peter Hellinger Software *
  7.  *----------------------------------------------------------------------*
  8.  *            Dieses Modul ist urheberrechtlich geschtzt.              *
  9.  *                                                                      *
  10.  * Die Ver”ffentlichung des Quelltextes oder Teilen daraus, sowie die   *
  11.  * Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
  12.  * oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail-    *
  13.  * boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen    *
  14.  * Einverst„ndnisserkl„rung des Autors.                                 *
  15.  *                                                                      *
  16.  * Die Verbreitung des Moduls als Teil eines gelinkten Programms ist    *
  17.  * fr Lizenznehmer ausdrcklich erlaubt!  Der Autor beh„lt sich das    *
  18.  * Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
  19.  * widerrufen.                                                          *
  20.  *----------------------------------------------------------------------*)
  21.  
  22. IMPLEMENTATION MODULE mtCommand;
  23.  
  24. (*----------------------------------------------------------------------*
  25.  * Int. Vers | Datum    | Name | Žnderung                               *
  26.  *-----------+----------+------+----------------------------------------*
  27.  *  3.00     | 18.01.92 |  Hp  |                                        *
  28.  *-----------+----------+------+----------------------------------------*)
  29.  
  30.  
  31. (* IMPLEMENTATION FšR  >>> Megamax-Modula-2 <<< *)
  32. (*                                              *)
  33. (*$R-   Range-Checks                            *)
  34. (*$S-   Stack-Check                             *)
  35. (*                                              *)
  36. (*----------------------------------------------*)
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43. FROM MagicSys   IMPORT  Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
  44.                         Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
  45.                         Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
  46.                         sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
  47.                         CastToChar, CastToByte, CastToByteset, CastToInt,
  48.                         CastToCard, CastToBitset, CastToWord, CastToLInt,
  49.                         CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
  50.                         TosVersion, Accessory, Basepage, SysHeader, TosDate;
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57. FROM SYSTEM     IMPORT  ADDRESS, ADR, BYTE, TSIZE;
  58. FROM MagicStrings  IMPORT  Append, Assign, Length, Pos, Delete;
  59. IMPORT  MagicTypes;
  60.  
  61. (*----------------------------------------------------------------------*)
  62.  
  63. VAR     pCount:   sCARDINAL;
  64.         BasePage: MagicTypes.PtrPD;
  65.         Argv:     BOOLEAN;
  66.         arg:      sCARDINAL; (* Pos. des ersten Arg. in Environment *)
  67.         env:      POINTER TO ARRAY [0..MAX (CARDINAL)] OF CHAR;
  68.         path:     ARRAY [0..255] OF CHAR;
  69.         init:     sCARDINAL;
  70.         
  71.  
  72. PROCEDURE ArgV (): BOOLEAN;
  73. BEGIN
  74.  RETURN Argv;
  75. END ArgV;
  76.  
  77. PROCEDURE ParamCount (): sINTEGER;
  78. BEGIN
  79.  RETURN pCount;
  80. END ParamCount;
  81.  
  82. PROCEDURE EnvLine (n, pos: sINTEGER; VAR line: ARRAY OF CHAR): BOOLEAN;
  83. VAR (*$Reg*)  l: sCARDINAL;
  84.     (*$Reg*)  d: sCARDINAL;
  85.     (*$Reg*)  x: sCARDINAL;
  86.     p: sINTEGER;
  87. BEGIN
  88.  IF BasePage^.pEnv # Null THEN 
  89.   env:= BasePage^.pEnv;  x:= pos;  p:= 0;  d:= 0;  l:= HIGH (line);
  90.   LOOP
  91.    IF p = n THEN
  92.     WHILE (env^[x] # 0C) AND (d < l) DO
  93.      line[d]:= env^[x];  INC (x);  INC (d);
  94.     END; (* WHILE *)
  95.     line[d]:= 0C;
  96.     RETURN TRUE;
  97.    END;
  98.    IF (env^[x] = 0C) THEN
  99.     IF (env^[x + 1] = 0C) THEN
  100.      (* Doppelnull, fertisch *)  RETURN FALSE;
  101.     END;
  102.     INC (p);
  103.    END;
  104.    INC (x);
  105.   END;
  106.  END;
  107.  RETURN FALSE;
  108. END EnvLine;
  109.  
  110. PROCEDURE ParamString (n: sINTEGER; VAR argument: ARRAY OF CHAR);
  111. VAR (*$Reg*)  c: sCARDINAL;
  112.     (*$Reg*)  d: sCARDINAL;
  113.     (*$Reg*)  x: sCARDINAL;
  114.     l: sCARDINAL;
  115.     p: sINTEGER;
  116.     b: BOOLEAN;
  117. BEGIN
  118.  argument[0]:= 0C;
  119.  IF Argv THEN (* Parameter im Environment *)
  120.   IF n = 0 THEN (* argv0 liefern, daž ist der Programmpfad! *)
  121.    Assign (path, argument);
  122.   ELSIF n > 0 THEN
  123.    b:= EnvLine (n - 1, arg, argument);
  124.   END;
  125.  ELSE (* Kein Argv, Parameter in der Kommandozeile *)
  126.   IF n > 0 THEN
  127.    p:= 1;  c:= 1;  l:= ORD(BasePage^.pCmdlin[0]);
  128.    LOOP
  129.     IF n = p THEN
  130.      d:= 0;  DEC (c);  IF c = 0 THEN c:= 1; END;
  131.      WITH BasePage^ DO
  132.       WHILE (pCmdlin[c] # 0C) AND (pCmdlin[c] # ' ') AND (c <= 126) DO
  133.        argument[d]:= pCmdlin[c];  INC (c);  INC (d);
  134.       END;
  135.      END;
  136.      argument[d]:= 0C;
  137.      RETURN
  138.     END;
  139.     IF (c = l) OR (c > 126) THEN  EXIT  END;
  140.     IF (BasePage^.pCmdlin[c] = ' ') THEN
  141.      INC (p);  WHILE (BasePage^.pCmdlin[c] = ' ') DO  INC (c);  END;
  142.     END;
  143.     INC (c);
  144.    END;
  145.   END;
  146.  END;
  147. END ParamString;
  148.  
  149. PROCEDURE EnvVar (REF name: ARRAY OF CHAR; VAR value: ARRAY OF CHAR): BOOLEAN;
  150. VAR b: BOOLEAN;
  151.     i: sINTEGER;
  152.     c: sCARDINAL;
  153.     n: ARRAY [0..255] OF CHAR;
  154.     str: ARRAY [0..255] OF CHAR;
  155. BEGIN
  156.  i:= 0;  str[0]:= 0C;  value[0]:= 0C;
  157.  Assign (name, n);
  158.  IF n[LENGTH(n)-1] # '=' THEN Append ('=', n); END;
  159.  REPEAT
  160.   b:= EnvLine (i, 0, str);
  161.   IF b THEN
  162.    c:= Pos (n, str, 0, n[0] = '*'); 
  163.    IF c < SIZE (str) THEN  
  164.     Delete (str, c, Length(n));    
  165.     Assign (str, value);
  166.     RETURN TRUE;
  167.    END;
  168.   END;
  169.   INC (i);
  170.  UNTIL b = FALSE;
  171.  RETURN FALSE;
  172. END EnvVar;
  173.  
  174. PROCEDURE Init;
  175. VAR (*$Reg*) v: sCARDINAL; (* Counter durchs Environment *)
  176.     (*$Reg*) x: sCARDINAL;
  177.     (*$Reg*) c: sCARDINAL;
  178.     l: sCARDINAL;
  179. BEGIN
  180.  IF init # 30961 THEN
  181.   Argv:= FALSE;  pCount:= 0;  arg:= 0;
  182.  
  183.   (* Basepage auslesen *)
  184.   BasePage:= Basepage ();
  185.   l:= ORD(BasePage^.pCmdlin[0]);
  186.   IF l = 127 THEN
  187.    env:= BasePage^.pEnv;
  188.    (* 'ARGV=' suchen *)
  189.    v:= 0;
  190.    LOOP
  191.     IF (env^[v] = 0C) AND (env^[v + 1] = 0C) THEN  EXIT;  END;
  192.     Argv:= (env^[v    ] = 'A') AND 
  193.            (env^[v + 1] = 'R') AND 
  194.            (env^[v + 2] = 'G') AND
  195.            (env^[v + 3] = 'V') AND
  196.            (env^[v + 4] = '=');
  197.     IF Argv THEN  env^[v]:= 0C;  INC (v, 5);  EXIT;  END;
  198.     INC (v);
  199.    END; (* LOOP *)
  200.   END;
  201.   
  202.   IF Argv THEN
  203.    (* Nach erstem Null-Char suchen, v zeigt auf das Zeichen nach 'ARGV=' *)
  204.    WHILE env^[v] # 0C DO  INC (v);  END;
  205.    INC (v); (* Erstes Zeichen des folgenden Parameters *)
  206.  
  207.    (* Hier beginnt der erste Parameter. Das ist der Name und Pfad unter
  208.     * der das Programm gestartet wurde...
  209.     *)
  210.    x:= 0;
  211.    WHILE (env^[v] # 0C) AND (x < 255) DO
  212.     path[x]:= env^[v];  INC (v);  INC (x);
  213.    END;
  214.    path[x]:= 0C;
  215.  
  216.    arg:= v + 1; (* Position des ersten Arguments im Environment *)
  217.    pCount:= 0; (* Argumentz„hler l”schen *)
  218.    LOOP
  219.     INC (v);
  220.     IF env^[v] = 0C THEN (* Doppelnull, fertisch *)  EXIT;  END;
  221.     INC (pCount);
  222.     WHILE env^[v] # 0C DO  INC (v); END;
  223.    END;
  224.  
  225.   ELSE (* Kein ARGV, Parameter aus der Basepage holen *)
  226.    IF (l > 0) THEN
  227.     pCount:= 1;  c:= 1;
  228.     LOOP
  229.      IF c = l THEN  EXIT;  END;
  230.      IF (BasePage^.pCmdlin[c] = ' ') THEN
  231.       INC (pCount);
  232.       WHILE (BasePage^.pCmdlin[c] = ' ') DO  INC (c);  END;
  233.      END;
  234.      INC (c);
  235.     END;
  236.    ELSE 
  237.     pCount:= 0;
  238.    END; 
  239.   END;
  240.   init:= 30961;
  241.  END;
  242. END Init;
  243.  
  244. BEGIN
  245.  init:= 0;  Init;
  246. END mtCommand.
  247.